Parser.php
<?php
namespace BetterReg;
class Parser {
public $functions = [];
protected $regex;
protected $patterns = [
'comment'=>'/(?:^|\s)#[^\n]*$/m',
'pad'=> '/(^\s*|\s*$)/m',
'esc_trail_slash'=>'/(^|[^\\\\])((?:\\\\\\\\)*)(\\\\)$/m',
'replace_esc_trail_slash'=>'$1$2\\ ',
];
public function parse($regex){
$parsed = ['sourceReg'=>$regex, 'functions'=>[], 'cleanReg'=>null];
$reg = $regex;
$cleanReg = $reg;
$cleanReg = $this->removeComments($cleanReg);
$cleanReg = $this->removePad($cleanReg);
$cleanReg = $this->addEscapedTrailingSpace($cleanReg);
$cleanReg = $this->implodeLines($cleanReg);
$parsed['cleanReg'] = $cleanReg;
$split = explode("\n",$reg);
$lines = array_map([$this,'cleanLine'], $split);
$functions = [];
$i = 0;
do {
$line = $lines[$i];
$func = $this->parseRegFunc($line);
if ($func==false)continue;
$parsed['functions'][] = $func;
} while (count($lines)>++$i);
return $parsed;
}
public function replace($function, $string){
$this->regex = str_replace($function->declaration, $string,$this->regex);
}
protected function removeComments($reg){
$reg = preg_replace($this->patterns['comment'],'',$reg);
return $reg;
}
protected function removePad($reg){
$reg = preg_replace($this->patterns['pad'],'',$reg);
return $reg;
}
protected function addEscapedTrailingSpace($reg){
$reg = preg_replace($this->patterns['esc_trail_slash'], $this->patterns['replace_esc_trail_slash'], $reg);
return $reg;
}
protected function implodeLines($reg){
$arrayOfLines = explode("\n",
str_replace(["\r\n","\n\r","\r"],"\n",$reg)
);
$reg = implode('',$arrayOfLines);
return $reg;
}
protected function cleanLine($regLine){
$pos = strpos($regLine,' ## ');
if ($pos!==false)$regLine = substr($regLine,0,$pos);
$regLine = trim($regLine);
return trim($regLine);
}
protected function parseRegFunc($line){
$funcReg = '/\:\:([a-zA-Z0-9]*)\((.*)\)/';
$matches = [];
$match = preg_match($funcReg,$line,$matches);
if (!$match) return false;
$specialCharsReg = '\.\-\_';
$getRefs = '/\{\{([a-zA-Z'.$specialCharsReg.'0-9]+)\}\}/';
$isRefsArg = '/^(\{\{([a-zA-Z'.$specialCharsReg.'0-9]+)\}\})+$/';
$funcName = $matches[1];
$argsList = explode(' ;; ',$matches[2]);
$finalArgList = [];
$func = ['definition'=>$matches[0],'name'=>$funcName,'args'=>[], 'argString'=>$matches[2]];
while ($arg = current($argsList)){
next($argsList);
$arg = trim($arg);
if (preg_match($isRefsArg,$arg)){
$refs = [];
preg_match_all($getRefs,$arg,$refs);
$arg = $refs[1];
}
$func['args'][] = $arg;
}
return (object)$func;
}
}